home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-28 | 4.2 KB | 200 lines | [TEXT/CWIE] |
- // ListHead.cp
-
- #ifndef ListHead_h
- #include "ListHead.h"
- #endif
- #ifndef ListLink_h
- #include "ListLink.h"
- #endif
- #ifndef ListLoop_h
- #include "ListLoop.h"
- #endif
-
- template < class Element >
- ListHead<Element>::ListHead()
- : first( 0 ),
- last( 0 ),
- firstLoop( 0 )
- {
- }
-
- template < class Element >
- ListHead<Element>::~ListHead()
- {
- Assert( IsEmpty() );
- Assert( firstLoop == 0 );
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, BeforeStart )
- {
- Assert( !link.Listed() );
- link.previous = 0;
- link.next = first;
- first = &link;
- if ( link.next != 0 )
- link.next->previous = &link;
- else
- last = &link;
- link.head = this;
-
- for ( Loop *loop = firstLoop; loop != 0; loop = loop->nextLoop )
- if ( loop->Unfinished() && loop->Null() && loop->previous == 0 )
- loop->previous = &link;
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, AfterEnd )
- {
- Assert( !link.Listed() );
- link.next = 0;
- link.previous = last;
- last = &link;
- if ( link.previous != 0 )
- link.previous->next = &link;
- else
- first = &link;
- link.head = this;
-
- for ( Loop *loop = firstLoop; loop != 0; loop = loop->nextLoop )
- if ( loop->Unfinished() && loop->Null() && loop->next == 0 )
- loop->next = &link;
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, Before, const Link& position )
- {
- Assert( !link.Listed() );
- Assert( position.head == this );
-
- link.next = const_cast< Link * >( &position );
- link.previous = position.previous;
- link.next->previous = &link;
- if ( link.previous != 0 )
- link.previous->next = &link;
- else
- first = &link;
- link.head = this;
-
- for ( Loop *loop = firstLoop; loop != 0; loop = loop->nextLoop )
- if ( loop->next == &position )
- loop->next = &link;
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, After, const Link& position )
- {
- Assert( !link.Listed() );
- Assert( position.head == this );
-
- link.next = position.next;
- link.previous = const_cast< Link * >( &position );
- link.previous->next = &link;
- if ( link.next != 0 )
- link.next->previous = &link;
- else
- last = &link;
- link.head = this;
-
- for ( Loop *loop = firstLoop; loop != 0; loop = loop->nextLoop )
- if ( loop->previous == &position )
- loop->previous = &link;
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, Before, const Loop& position )
- {
- Assert( &position.head == this );
- Assert( position.Unfinished() );
-
- if ( !position.Null() )
- AddBefore( link, position.Link() );
- else
- if ( position.previous == 0 )
- AddToHead( link );
- else
- AddAfter( *position.previous, link );
- }
-
- template < class Element >
- void ListHead<Element>::Add( Link& link, After, const Loop& position )
- {
- Assert( &position.head == this );
- Assert( position.Unfinished() );
-
- if ( !position.Null() )
- AddAfter( position.Link(), link );
- else
- if ( position.next == 0 )
- AddToTail( link );
- else
- AddBefore( link, *position.next );
- }
-
- template < class Element >
- void ListHead<Element>::Remove( Link& link )
- {
- Assert( link.head == this );
-
- if ( link.next != 0 )
- link.next->previous = link.previous;
- else
- last = link.previous;
-
- if ( link.previous != 0 )
- link.previous->next = link.next;
- else
- first = link.next;
-
- for ( Loop *loop = firstLoop; loop != 0; loop = loop->nextLoop )
- {
- if ( loop->position == &link )
- {
- loop->position = 0;
- loop->next = link.next;
- loop->previous = link.previous;
- }
-
- if ( loop->next == &link )
- loop->next = link.next;
-
- if ( loop->previous == &link )
- loop->previous = link.previous;
- }
-
- link.previous = 0;
- link.next = 0;
- link.head = 0;
- }
-
- template < class Element >
- void ListHead<Element>::RemoveAll()
- {
- while( !IsEmpty() )
- Remove( *first );
- }
-
- template < class Element >
- void ListHead<Element>::Register( Loop& loop ) const
- {
- Assert( &loop.head == this );
- loop.nextLoop = firstLoop;
- const_cast< Loop *& >( firstLoop ) = &loop;
- }
-
- template < class Element >
- void ListHead<Element>::Unregister( Loop& loop ) const
- {
- Assert( &loop.head == this );
-
- Loop** connection = const_cast< Loop ** >( &firstLoop );
- while ( *connection != &loop )
- {
- Assert( *connection != 0 );
- connection = &(*connection)->nextLoop;
- }
-
- *connection = (*connection)->nextLoop;
- loop.nextLoop = 0;
- }
-